﻿using System;

namespace GameFramework.buff
{
    [Serializable]
    public class BuffConfig
    {
        public int id;

        public  string name;

        public string desc;
        //【修改属性】-一般都是有时间的buff，每隔一段时间触发一次
        //1.属性改变固定值，values[属性类型，属性值，属性类型，属性值]
        //2.属性改变百分比(基础属性)，values[属性类型，百分比，属性类型，百分比]
        //3.属性上限改变固定值，values[属性类型，属性值，属性类型，属性值]
        //4.属性上限改变百分比(基础属性)，values[属性类型，百分比，属性类型，百分比]
        //【修改状态】  非常多的游戏效果实际上都是这几种状态+运动+动画的组合
        //5.眩晕--目标不再响应任何操控
        //6.沉默--目标禁止施放技能
        //7.缠绕--目标不响应移动请求，但是可以执行某些操作，如施放某些技能
        //8.无敌--几乎不受到所有的伤害和效果影响
        //9.隐身--不可被其他人看见
        //【修改运动】 运动有优先级，高优先级的打断低优先级的运动，播放高优先级的运动
        //轻功击退击飞等位移效果实际上是State(状态)+Motion(运动)+Animation(动画)的组合
        //10.击飞(大锤1技能)
        //11.击退(白牛被动)
        //12.冲刺(滚滚刺，推推)
        //13.拖拽(屠夫钩子)
        //14.吸引(巫妖的3技能，父王的吼)
        //【其他标注buff，比如经验buff，红名buff等】
        public int type;
        
        //生效类型？，正面，负面，无
        public int effectType;

        //buff生效次数
        //默认1次，小于等于0 则表示按duration期间interval生效的次数
        public int effectTimes;
        //在有时间限制的情况下，没有次数则立即销毁buff
        public bool noTimesToEnd;
        //移除buff时，是否恢复到生效前的值
        //比如生效前速度为8，生效后为6，移除时速度恢复到8
        public bool resetOnDestroy;

        //非同源buff的合并类型
        //1.不同目标合并为一个buff,一般为给boss加buff时
        //2.不同目标单独存在
        //3.不处理，此类型buff只能存在一个(比如boss的第一刀标记buff)
        public int mergeType;
        
        //同源buff的叠加类型
        //1.层数叠加，重置时间
        //2.层数叠加，不重置时间
        //3.重置时间
        //4.累加时间
        //5.不处理(有了相同buff，其他buff来了不生效,比如相同类型的回血buff，回血不叠加)
        public int overlapType;

        //执行类型：
        //1.只生效一次
        //2.间隔时间触发(巫医诅咒) 
        //3.根据位移触发(血魔大)
        public int excuteType;

        //1.时间结束时减少层数
        //2.时间结束直接移除buff
        public int destroyType;

        //叠加类型的限制
        //时间：则为最大时间
        //层数：则为最大层数
        public int maxLimit;

        //是否要展示出来
        //(用户能否看到这个状态图标)
        public bool show;

        public string icon;
        //释放者是否强制设置为空
        //Releaser不仅仅是一个成员项，它还关系到Buff合并问题。如果存在两个Type类型相同的Buff时候，
        //当他们的Releaser相同才可以走合并流程（Buff层数增加），如果Releaser不同，则不能合并。
        //当策划有一些玩法需求可以多人给BOSS叠Buff时就可以配置Buff的bNoCaster=true，这样就不需要开发者在写代码添加Buff的时候小心翼翼的设置Caster参数为空了。
        //另外还有几种情况也需要设置bNoCaster=true，比如存在一个熔岩地图，或者冰雪地图，玩家每秒掉多少血量，这个时候也可以配置bNoCaster=true。
        //再比如说一些活动buff，如双倍经验buff，红名惩罚buff，都可以由策划配置bNoCaster=true。类似于双倍经验，还有红名Buff这种所有需要存盘的Buff，
        //我们都需要设置bNoCaster=true。
        public bool bNoReleaser;
        
        //隔多久后开始生效第一次
        public float delay;
        
        //buff持续时间
        public float duration;

        //buff间隔触发时间
        public float interval;
        //TODO buff组？一般为一组中任意buff的id，用于多个buff组合，可用于设置各个阶段对组内其他buff的操作(移除，增强等等)
        //设置：设置一个组根buff，不带任何效果，只用于显示ICON，其他组内buff实现具体的效果，比如：
        //白牛的击退效果：一个击退ICONbuff+一个眩晕buff+一个击退位移buff+...
        public int group;

        //buff所属标签
        public bool tag;

        //免疫其他buff的tag
        public bool immuneTag;

        //不同buff类型对应不同值
        //【属性】：[属性类型，属性值，属性类型，属性值...]
        //【状态】：[持续时间]
        //【运动】：[方向，速度，时间，速度变化率]
        //方向(角色正向，角色反向，攻击正方向，攻击反方向)
        //角色正向：推推
        //角色反方向：大推推
        //攻击正方向：白牛击退
        //攻击反方向：
        public float[] values;
    }
}